/**
 * 在这里定义和用户相关的路由处理函数，供 /router/user.js 模块进行调用
 */
// 导入数据库操作模块
const db = require('../db/index')

// 导入bcryptjs 这个包对密码加密处理
const bcrypt = require('bcryptjs')

// 导入Token包
const jwt = require('jsonwebtoken')

// 导入全局的配置文件
const config = require('../config')

const fs = require('fs')

// 注册用户的处理函数
exports.regUser = (req, res) => {
    // 获取客户端提交到服务器的用户信息
    const userinfo = req.body

    //定义sql语句 查询学号是否被占用
    const sqlStr = 'select * from user where student_id =? '
    // 进行查询用户调用
    db.query(sqlStr, [userinfo.student_id ], (err,results) => {
        // 执行SQL语句失败
        if(err) {
            return res.cc(err)
        }
        // 判断是否被占用
        if(results.length > 0) {
            return res.cc('学号重复！')
        }
        // 调用bcrypt.hashSync()对密码进行加密
        let password = userinfo.id_card.slice(12,18)
        // console.log(password);
        password = bcrypt.hashSync(password, 10)
        // 定义插入新用户的SQL语句
        const sql = 'insert into user set ?'
        // 调用 db.query() 执行 SQL语句
        db.query(sql, {student_id : userinfo.student_id , password: password , user_name: userinfo.user_name , id_card: userinfo.id_card , head_img: '123.jpg' , professional: userinfo.professional, nickname: userinfo.user_name}, (err,results) => {
            if(err) return res.cc(err)
            // 判断影响行数是否唯1
            if(results.affectedRows !== 1) return res.cc('注册用户失败，请稍后再试！')
            // 注册用户成功
            res.cc('注册成功！',0)
        })
    })   





    // res.send('reguser OK')
  }

    
  
  // 登录的处理函数
  exports.login = (req, res) => {
    //接收表单的数据
    const userinfo = req.body

    // 定义 SQL 语句
    const sql = 'select * from user where student_id=?'
    // 执行 SQL 语句，根据学号查询用户的信息

    db.query(sql, userinfo.student_id, (err, results) => {
        // 执行 SQL 语句失败
        if(err) return res.cc(err)

        // 执行 SQL 语句成功， 但是获取到的数据条件别等于 1
        if(results.length != 1) return res.cc('登录失败！')
       
        // 判断密码是否正确
        const compareResult = bcrypt.compareSync(userinfo.password, results[0].password)
        if(!compareResult) return res.cc('登录失败！')

        // TODO：在服务器生成 Token的字符串
        const user = {...results[0], password:'', user_pic:''}
        // 对用户的信息进行加密。，生成 Token 字符串
        const tokenStr = jwt.sign(user, config.jwtSecretKey, {expiresIn : config.expiresIn})
        // 调用res.send 将 Token 响应给客户端
        
        res.send({
            status: 0,
            message: '登陆成功！',
            token: 'Bearer ' +tokenStr
        })
        // res.cc('登录成功！', 0)        
    })




  }

// 忘记密码处理函数
exports.forgetPassword = (req,res) => {
    //接收表单的数据
    const userinfo = req.body

    // 定义 SQL 语句
    const sql = 'select * from user where (student_id =? and user_name=? and id_card=?)'

    db.query(sql, [userinfo.student_id ,userinfo.user_name ,userinfo.id_card], (err,results) => {
        // 执行SQL语句失败
        if(err) {
            return res.cc(err)
        }
        // // 判断是否被占用
        if(results.length != 1) {
            return res.cc('信息输入错误！')
        }

        // 定义重置用户密码的 SQL 语句
        const sql = `update user set password=? where (student_id =? and user_name=? and id_card=?)`

        // 对新密码进行 bcrypt 加密处理
        const newPwd = bcrypt.hashSync(req.body.newPwd, 10)
        
        // 执行 SQL 语句，根据 id 更新用户的密码
        db.query(sql, [newPwd, userinfo.student_id ,userinfo.user_name ,userinfo.id_card], (err, results) => {
            // SQL 语句执行失败
            if (err) return res.cc(err)

            // SQL 语句执行成功，但是影响行数不等于 1
            if (results.affectedRows !== 1) return res.cc('重置密码失败！')

            // 更新密码成功
            res.cc('重置密码成功！', 0)
        })
    })
}


// 上传图片
exports.uploadImgImg = (req,res) => {

     // 获取到file的信息 ---> 只能通过req.file
        let fileObj = req.file
        console.log(req.file);
        // 分割出type ( jpg/png/gif )
    let originalArr = fileObj.originalname.split('.')
    // console.log(originalArr);
    let type = originalArr[originalArr.length - 1]

    // 读取文件 ( path, 'utf-8'(这里不写解码类型,直接把回调函数中的data写入新文件即可), callback)
  fs.readFile('uploads/' + fileObj.filename, (err, data) => {
    if(err) return res.cc(err)

    // 创建复制图片的路径 以及 拼接type形成一个完整的图片文件
    let newPath = '../uploads/' + fileObj.filename + "." + type
    
    // 写入复制的图片 (path, data, callback)
    fs.writeFile('uploads/' + newPath, data, (err) => { // 把读取到的data写入
        if(err) return res.cc(err)
      // 删除原uploads路径下的图片
      fs.unlink('uploads/' + fileObj.filename, () => {
      	res.send({
      	  code: '200',
      	  msg: '上传成功',
          data:fileObj.filename + "." + type
      	})
      })
    })
})
    //  res.send({
    //     status:0,
    //     message: '图片路径',
    //     data:uppath
    // })
}


// 修改用户type信息
exports.chengeTypeType = (req, res) => {
    // 定义待执行的 SQL 语句
    const sql = 'update user set ? where user_id=?'
    // console.log(req);
    // 调用 db.query() 执行 SQL 语句并传递参数
    db.query(sql,[req.body, req.body.user_id], (err,results) => {
        // 执行SQL 语句失败
        if(err) return res.cc(err)
        // 执行 SQL 语句成功 但是影响行数不等于1
        if(results.affectedRows !== 1) return res.cc('更新type类型失败！')
        // 成功
        res.cc('更新type类型成功！',0) 
    })
}